/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Interacción del mantenimiento CDI's
 * @author geovany
*/
public class CdiAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Cdi cdi;
    private String nomCdi;
    private String fecAper;
    private String municipio;
    private String VERhis;
    private String formaBus;
    private String departamento;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad CDI. 
 */    
 
public CdiAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        cdi = new    Cdi();
        
        cdi.setIdMunicipio(new Municipio());
}   
/**
 * Busca el método que se ejecutara
 */ 
    @Override
    public String execute(){
        buscarMetodo(cdi);        
        return null;
    }
 /**
 * @param objeto de la entidad CDI
 * Agrega un nuevo CDI, usa la entidad CDI
 */           
    @Override    
    public void agregarEntidad(Object o) {
        Cdi c;
        try{
            Date    date    =   new Date();
            c = (Cdi)o;
           
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();

            c.setFecIniCdi(date);
            c.setAuAddUsr(Integer.parseInt(idUsuario));
            c.setAuAddDat(date);

            genericoDAO.save(c);
        }catch(Exception e){
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad CDI
 * Modifica el registro que se recibe de parámetro a inactivo (-1)
 */     
        @Override
    public void borrarEntidad(Object o) {
        List<Cdi> listCdi;
        Cdi c;
        try{
            if(getId()!=null){
                listCdi = genericoDAO.find("SELECT c FROM Cdi c WHERE c.idCdi = " + getId(), null, null);
                if(!listCdi.isEmpty()){
                    c = listCdi.get(0);
                    c.setEstCdi(-1);
                    Date    date    =   new Date();
                    Calendar cal = Calendar.getInstance();
                    date=cal.getTime();
                    c.setFecCierreCdi(date);
                    genericoDAO.update(c);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad CDI
 * Modifica el registro que se recibe de parámetro estos valores se sobreescriben
 * al registro que ya se posee. 
 */        
    @Override
    public void editarEntidad(Object o) {
        Cdi c;
        try{
            Date    date    =   new Date();
            c = (Cdi)o;
            c.setIdCdi(new Integer(getId()));
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            Calendar cal = Calendar.getInstance();
            date=cal.getTime();
            
            setIdMunicipio(c.getIdMunicipio().getIdMunicipio());

            setAuModUsr(Integer.parseInt(idUsuario));
            setAuModDat(date);
            
            genericoDAO.update(c);
        }catch(Exception e){
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
    
 /**
 * Este método realiza las búsquedas de CDI's para llenar el grid del mantenimiento
 * esperando los filtros:
 *       nomCdi,
 *       fecAper,
 *       VERhis, 
 *       municipio,
 *       departamento
 */       
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        List<Cdi> listaCdi = null;
        String query="";
        nomCdi = getRequest().getParameter("NomCdi");
        fecAper = getRequest().getParameter("FecAper");
        municipio = getRequest().getParameter("municipio");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        departamento = getRequest().getParameter("departamento");
        
        String nomCdiquery = "";
        String queryFechaAper = "";
        String queryIdMunicipio = "";
        nomCdiquery = "c.nomCdi like upper('%" + nomCdi + "%') ";
        if(fecAper != null && !fecAper.equals("")){
                queryFechaAper = "and c.fecApertura = '" + fecAper + "' ";
        }
        if(municipio != null && !municipio.equals("") && !municipio.equals("null")){
                queryIdMunicipio = "and c.idMunicipio  = '" + municipio + "' ";
        }        
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    
                }else{
                    
                    query = "SELECT c FROM Cdi c ";
                    if(departamento != null && !departamento.equals("") && (municipio == null || municipio.equals(""))){
                        query += ", Municipio m WHERE m.idMunicipio = c.idMunicipio "+
                                 " and m.idDepartamento = "+departamento+ " and ";
                    }else{
                        query +=        " WHERE " ;
                    }            
                    query +=       nomCdiquery +
                    queryFechaAper +
                    queryIdMunicipio + 
                    "and (c.estCdi like upper('" + verHistorial + "') or "
                    + "c.estCdi like upper('" + verHistorialTemp + "'))"
                    + " ORDER BY c.nomCdi " + getSord();
                }
                if(!formaBus.equals("1")){ 
                //    query="";
                    
                    listaCdi = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                    query = "SELECT COUNT(c) FROM Cdi c ";
                        if(departamento != null && !departamento.equals("") && (municipio == null || municipio.equals(""))){
                            query += ", Municipio m WHERE m.idMunicipio = c.idMunicipio "+
                                 " and m.idDepartamento = "+departamento+ " and ";
                        }else{
                            query +=        " WHERE " ;
                        }            
                        query +=       nomCdiquery +
                        queryFechaAper +
                        queryIdMunicipio + 
                        "and (c.estCdi like upper('" + verHistorial + "') or "
                        + "c.estCdi like upper('" + verHistorialTemp + "'))";
                    total = genericoDAO.countRow(query);
                    //configuraciones basicas
                    jg.setPage(getPage());
                    jg.setRecords(total);
                    jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                    jg.setSord(getSord());
                    jg.setSidx(getSidx());
                    List<RowsGrid> rows = new ArrayList<RowsGrid>();

                    for(Cdi c: listaCdi){
                        RowsGrid r = new RowsGrid(); 
                        r.setId(c.getIdCdi().toString());
                        List cell = new ArrayList();
                        cell.add(c.getIdCdi().toString());
                        
                        cell.add(c.getNomCdi());
                        cell.add(c.getDesCdi());
                        
                        cell.add(c.getDirCdi());

                        if(c.getEstCdi() == 1){
                            cell.add("Activo");
                        }else{
                            cell.add("Inactivo");
                        }

                        cell.add(c.getTelCdi());
                        cell.add(c.getFecApertura() != null ? c.getFecApertura().toString() : "");
                        cell.add(c.getFecIniCdi().toString());
                        if(c.getFecCierreCdi() == null){
                            cell.add("");
                        }else{
                            cell.add(c.getFecCierreCdi().toString());
                        }   

                        cell.add(c.getIdMunicipio().getIdMunicipio());
                        cell.add(c.getIdMunicipio().getNomMunicipio());

                        cell.add(c.getAuAddUsr());
                        cell.add(c.getAuAddDat().toString());

                        r.setCell(cell);
                        rows.add(r);
                    }

                    jg.setRows(rows);
                    JSONObject jo = JSONObject.fromObject(jg);
                    enviarJsonNavegador(getResponse(), jo);
                }       
        }catch(Exception e){
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdCdi() {
        return cdi.getIdCdi();
    }

    public void setIdCdi(Integer idCdi) {
        cdi.setIdCdi(idCdi);
    }

    public String getNomCdi() {
        return cdi.getNomCdi();
    }

    public void setNomCdi(String nomCdi) {
        cdi.setNomCdi(nomCdi);
    }
    
    public String getDesCdi() {
        return cdi.getDesCdi();
    }

    public void setDesCdi(String desCdi) {
        cdi.setDesCdi(desCdi);
    }

    public String getDirCdi() {
        return cdi.getDirCdi();
    }

    public void setDirCdi(String dirCdi) {
        cdi.setDirCdi(dirCdi);
    }

    public int getEstCdi() {
        return cdi.getEstCdi();
    }

    public void setEstCdi(int estCdi) {
        cdi.setEstCdi(estCdi);
    }

    public String getTelCdi() {
        return cdi.getTelCdi();
    }

    public void setTelCdi(String telCdi) {
        cdi.setTelCdi(telCdi);
    }

    public String getFecIniCdi() {
        return Fecha.date2String(cdi.getFecIniCdi());
    }

    public void setFecIniCdi(String fecIniCdi) {
       try {
            if(fecIniCdi != null && !fecIniCdi.equals(""))
                cdi.setFecIniCdi(Fecha.string2Date(fecIniCdi));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public String getFecApertura() {
        return Fecha.date2String(cdi.getFecApertura());
    }

    public void setFecApertura(String fecApertura) {
       try {
            cdi.setFecApertura(Fecha.string2Date(fecApertura));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    

    public String getFecCierreCdi() {
        return Fecha.date2String(cdi.getFecCierreCdi());
    }

    public void setFecCierreCdi(String fecCierreCdi) {
        try {
            if(fecCierreCdi != null && !fecCierreCdi.equals(""))
                cdi.setFecCierreCdi(Fecha.string2Date(fecCierreCdi));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return cdi.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        cdi.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(cdi.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            if(auAddDat != null && !auAddDat.equals(""))
                cdi.setAuAddDat(Fecha.string2Date(auAddDat));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return cdi.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        cdi.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return cdi.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        cdi.setAuModDat(auModDat);
    }

    public Integer getIdMunicipio() {
        return cdi.getIdMunicipio().getIdMunicipio();
    }

    public void setIdMunicipio(Integer idMunicipio) {
        cdi.getIdMunicipio().setIdMunicipio(idMunicipio);
    }
 /**
 * Ejecuta el reporte de CDI's registrados, puede recibir los filtros:
 *       nomCdi,
 *       fecAper,
 *       VERhis, 
 *       municipio,
 *       departamento.
 */     
    @Override
    public void reporteXls() {
        
        String query="";
        nomCdi = getRequest().getParameter("NomCdi");
        fecAper = getRequest().getParameter("FecAper");
        municipio = getRequest().getParameter("municipio");
        VERhis = getRequest().getParameter("VERhis");
        departamento = getRequest().getParameter("departamento");
        
        String nomCdiquery = "";
        String queryFechaAper = "";
        String queryIdMunicipio = "";
        nomCdiquery = "c.nomCdi like upper('%" + nomCdi + "%') ";
        if(fecAper != null && !fecAper.equals("")){
                queryFechaAper = "and c.fecApertura = '" + fecAper + "' ";
        }
        if(municipio != null && !municipio.equals("") && !municipio.equals("null")){
                queryIdMunicipio = "and c.idMunicipio  = '" + municipio + "' ";
        }   
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        
        query = "SELECT c FROM Cdi c ";
        if(departamento != null && !departamento.equals("") && (municipio == null || municipio.equals(""))){
            query += ", Municipio m WHERE m.idMunicipio = c.idMunicipio "+
                     " and m.idDepartamento = "+departamento+ " and ";
        }else{
            query +=        " WHERE " ;
        } 
        query +=                nomCdiquery +
                                queryFechaAper +
                                queryIdMunicipio + 
                                "and (c.estCdi like upper('" + verHistorial + "') or "
                                + "c.estCdi like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY c.nomCdi asc";
        
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            

                // capturamos la direccion absoluta de la plantilla del reporte en el servidor 
            //    String path = getServlet().getServletContext().getRealPath("/xlt/reporteConsolidadoSMS.xlt");
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportCdi.xlt");
                FileInputStream stream = new FileInputStream(ruta); // obtenemos al archivo
                libro = new HSSFWorkbook(stream);      // el libro de trabajo

                response.setHeader("Pragma", "cache");          // Para mostrar ventana de apertura del archivo
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportCdi.xls");
        
                libro = generarExcel(libro,query); 

                libro.write(out);
                out.flush();
                out.close();
        }catch(Exception e){
          e.printStackTrace();
        }         
    }
  private HSSFWorkbook generarExcel(HSSFWorkbook book, String queryExt) {
          /**
     * EL ESTILO DEL REPORTE
     */
      HSSFCellStyle styleBordere = book.createCellStyle();
      HSSFFont fontReport = book.createFont();
      fontReport.setFontName("Arial");
      fontReport.setFontHeightInPoints((short)10);
      styleBordere.setFont(fontReport);
      styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
      styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
      styleBordere.setBorderRight(styleBordere.BORDER_THIN);
      styleBordere.setBorderTop(styleBordere.BORDER_THIN);
      styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      
      List<Cdi> listaCdi = null;
      
      HSSFSheet sheet = book.getSheet("Hoja1"); //nombre de la hoja 
      HSSFRow row = sheet.getRow(1);
      HSSFCell celda = null;
      Date      today    =   new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    //  String    ahora   =   ;
      row = sheet.createRow(3);
      celda = row.createCell(6);
      celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
      celda.setCellStyle(styleBordere);
      int col = 1;
      int fila  = 11;
      String query = queryExt;
                    
                    /*if(getNomCdi()!=null){
                        query += " upper(c.nomCdi) like upper('%"+ getNomCdi() +"%') and  ";
                    }
                    if(getDirCdi()!=null){
                        query += " upper(a.dirCdi) like upper('%"+getDirCdi()+"%') and  ";
                    }
                    if(getTelCdi()!=null){
                        query += " c.telCdi like '%"+getTelCdi()+"%' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by c.nomCdi ";*/
      listaCdi = genericoDAO.find(query,null,null);
     // listaCdi = genericoDAO.find(query,null,null);

      for(Cdi c: listaCdi){

            col = 1;
            row = sheet.createRow(fila);
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getNomCdi())));
            celda.setCellStyle(styleBordere);
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getDesCdi())));
            celda.setCellStyle(styleBordere);
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getDirCdi())));
            celda.setCellStyle(styleBordere);           
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getFecApertura()!= null ?sdf.format(c.getFecApertura()): "Aún no definida")));
            celda.setCellStyle(styleBordere);   
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getTelCdi()!= null ?c.getTelCdi(): "No disponible")));
            celda.setCellStyle(styleBordere);  
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(c.getIdMunicipio().getNomMunicipio())));
            celda.setCellStyle(styleBordere);  

            fila ++;
      }      
      return book;  
    }
    
            
}
